/**
 * 高阶函数：如果一个函数的形参或者返回值也是一个函数
 * 1. 回调函数
 * 2. 闭包
 * 3. 函数柯里化
 */

/**
 * 1. 回调函数
 * 作用：获取函数内部的数据
 * @param {*} url 
 * @param {*} callback 
 */
const myAjax = (url, callback) => {
  setTimeout(() => {
    console.log(url)
    callback({ status: 200, data: [] })
  }, 2000)
}
// 调用
myAjax('api', (res) => {
  console.log('获取数据：', res)
})


/**
 * 2. 闭包=》函数套函数=》高阶函数
 * 作用：
 * 1. 定义的变量会常驻内存
 * 2. 避免全局变量污染
 * 考题：
 * 1-利用闭包写一个函数，这个函数调用后返回一个新函数
 * 2-这个新函数每次调用都会输出一个自加一的值：第一次0=》1=》2.....
 */
const Fnc = () => {
  // 这个变量的值会常驻内存
  let count = 0
  return function () {
    console.log(count)
    count++
    // count = null
  }
}

  // 自执行表达式
  ; (function (w) {
    console.log(w)
    // 闭包内部才能访问
    var men1 = 10000
  })(window)

/**
 * 函数柯里化：把一个多参数函数，转换为一个单参函数并且返回接收余下参数和结果的函数
 * 作用：
 * 1. 参数复用
 * 2. 延迟调用
 */
// 多参函数
const Fnb = (a, b, c) => {
  return a + b + c
}
console.log(Fnb(1, 2, 3))
// 柯里化函数
const Klh = (a) => {
  // 1. 写逻辑
  return function (b) {
    // 2. 写逻辑
    return function (c) {
      // 3. 结果
      return a + b + c
    }
  }
}
console.log(Klh(10)(20)(6))

let fn3 = Klh(10)(20)
// 根据需要求值
console.log(fn3, fn3(100), fn3(200))

